package com.xsz.lambdademo;

public class Test2 {
    public static void main(String[] args) {
        //java8 之前写法
        ImplInterface implInterface=new ImplInterface();
        implInterface.name="张三";
        Test1 test1=new Test1(implInterface);
        System.out.println(test1.getName());

        //java8 写法
        /**
         * 由语法可以看到，Lambda表达式包含了三个部分：
         * 参数列表；
         * 箭头->把参数列表与Lambda主体分隔开；
         * Lambda主体，只有一行代码的时候可以省略大括号和return关键字。
         */
//        Test1 test2=new Test1(()->{ return  "李四";});
        Test1 test2=new Test1(()->"李四");
        System.out.println(test2.getName());


        TransForm<String, Integer> t = (String str) -> Integer.valueOf(str);
        System.out.println(t.transForm("123"));

        TransForm<String, Integer> t2 = (str) -> Integer.valueOf(str);
        System.out.println(t2.transForm("123"));
        /**
         * 你肯定很困惑，这还是Lambda表达式吗，箭头去哪里了？双冒号又是什么鬼？
         * 其实这种写法有一个新的名称，叫做方法的引用。
         * 方法引用可以被看作仅仅调用特定方法的Lambda的一种快捷写法。
         * 它的基本思想是，如果一个Lambda代表的只是“直接调用这个方法”，
         * 那最好还是用名称来调用它，而不是去描述如何调用它，
         * 这样代码可读性更好。基本写法就是目标引用放在分隔符::前，方法的名称放在后面。
         * 举几个Lambda及其等效方法引用的例子：
         *
         * Lambda表达式 等效方法引用
         * (String s) -> System.out.println(s) System.out::println
         * (str, i) -> str.substring(i) String::substring
         * () -> Thread.currentThread().dumpStack() Thread.currentThread()::dumpStack
         */
        TransForm<String, Integer> t3 = Integer::valueOf;
        System.out.println(t3.transForm("123"));



    }
}
